
package com.jsoft.controller;

import com.jsoft.annotation.Log;
import com.jsoft.constant.Constants;
import com.jsoft.entity.User;
import com.jsoft.exception.BusinessException;
import com.jsoft.service.UserService;
import com.jsoft.util.Result;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.Objects;


/**
 * (User)表控制层
 *
 * 有用，勿动！！！
 * @author syr
 * @since 2025-03-14 23:30:25
 */

@RestController
@RequestMapping("user")
public class UserController {


    /**
     * 服务对象
     */
    @Resource
    private UserService userService;


    /**
     * 通过用户名查询单条数据
     * 有用，勿动（syr）
     *
     * @return 单条数据
     */
    @GetMapping
    public Result<User> queryByUsername() {
        //从请求头中获取当前用户名
        HttpServletRequest request =
                ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        String username = request.getHeader(Constants.HEADER_USERNAME);
        //根据用户名去数据库查询userList
        List<User> userList = userService.queryByUsername(username);
        //如果查不到，说明用户名错误
        if (userList == null || userList.isEmpty()) {
            throw new BusinessException("用户名错误", Code.GET_ERR);
        } else {
            //如果查到了，获取当前用户信息
            User user = userList.get(0);
            return Result.success(user);
        }
    }

    /**
     * 根据用户名更新手机号或邮箱
     * 有用，勿动（syr）
     * @param user 实体
     * @return 编辑结果
     */
    @Log(title = "put",businessType = "修改用户信息")
    @PutMapping
    public Result<User> updateByUsername(@RequestBody User user) {
        //从请求头中获取当前用户名
        HttpServletRequest request =
                ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        String username = request.getHeader(Constants.HEADER_USERNAME);
        //根据用户名去数据库查询userList
        List<User> userList = userService.queryByUsername(username);
        //如果查不到，说明用户名错误
        if (userList == null || userList.isEmpty()) {
            throw new BusinessException("用户名错误", Code.GET_ERR);
        }
        //如果查到了，获取当前用户信息
        User user1 = userList.get(0);
        //判断用户填写的手机号和邮箱与查询到的结果是否一致
        //如果都一致，则无需修改
        if(user.getPhone().equals(user1.getPhone()) && user.getEmail().equals(user1.getEmail())){
            return Result.success();
        }
        //如果不一致，则需要修改
        //如果传入的手机号和查询到的手机号不一致，需要判断能否修改
        if (!user.getPhone().equals(user1.getPhone())) {
            //查询传入的手机号有没有被使用
            User user2 = userService.selectByPhone(user.getPhone());
            //如果手机号已被使用，返回错误信息
            if (user2 != null) {
                throw new BusinessException("手机号已经被使用", Code.UPDATE_ERR);
            }
            //如果手机号未被使用，则手机号验证通过
        }
        //如果传入的邮箱和查询到的邮箱不一致，需要判断能否修改
        if (!user.getEmail().equals(user1.getEmail())) {
            User user3 = userService.selectByEmail(user.getEmail());
            if (user3 != null) {
                throw new BusinessException("邮箱已经被使用", Code.UPDATE_ERR);
            }
            //如果邮箱未被使用，则邮箱验证通过
        }
        user.setUsername(username);
        user.setUpdateTime(new Date());
        userService.updateByUsername(user);
        return Result.success();
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public ResponseEntity<User> queryById(@PathVariable("id") Integer id) {
        return ResponseEntity.ok(this.userService.queryById(id));
    }

    /**
     * 新增数据
     *
     * @param user 实体
     * @return 新增结果
     */
    @PostMapping
    public ResponseEntity<User> add(User user) {
        return ResponseEntity.ok(this.userService.insert(user));
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
    @DeleteMapping
    public ResponseEntity<Boolean> deleteById(Integer id) {
        return ResponseEntity.ok(this.userService.deleteById(id));
    }

}


